from dataclasses import dataclass, field
from typing import Dict

@dataclass
class LanguageTypeMapper:
    """语言类型映射器"""
    type_mappings: Dict[str, Dict[str, str]] = field(default_factory=lambda: {
        'MEDIUMINT': {'typescript': 'number', 'java': 'Integer'},
        'TIMESTAMP': {'typescript': 'string', 'java': 'LocalDateTime'},
        'DATETIME': {'typescript': 'string', 'java': 'LocalDateTime'},
        'DATE': {'typescript': 'string', 'java': 'LocalDate'},
        'TIME': {'typescript': 'string', 'java': 'LocalTime'},
        'SMALLINT': {'typescript': 'number', 'java': 'Integer'},
        'TINYINT': {'typescript': 'number', 'java': 'Integer'},
        'BIGINT': {'typescript': 'number', 'java': 'Long'},
        'DECIMAL': {'typescript': 'number', 'java': 'BigDecimal'},
        'INTEGER': {'typescript': 'number', 'java': 'Integer'},
        'BOOLEAN': {'typescript': 'boolean', 'java': 'Boolean'},
        'VARCHAR': {'typescript': 'string', 'java': 'String'},
        'CHAR': {'typescript': 'string', 'java': 'String'},
        'DOUBLE': {'typescript': 'number', 'java': 'Double'},
        'FLOAT': {'typescript': 'number', 'java': 'Float'},
        'BIT': {'typescript': 'boolean', 'java': 'Boolean'},
        'INT': {'typescript': 'number', 'java': 'Integer'},
        'TEXT': {'typescript': 'string', 'java': 'String'},
        'BLOB': {'typescript': 'any', 'java': 'byte[]'},
        'REAL': {'typescript': 'number', 'java': 'Double'},
        'NUMERIC': {'typescript': 'number', 'java': 'BigDecimal'},
        'ENUM': {'typescript': 'string', 'java': 'String'},
        'SET': {'typescript': 'string', 'java': 'String'},
    })

    def get_type(self, sql_type: str, target_language: str) -> str:
        """获取目标语言的类型"""
        sql_type_upper = sql_type.upper()
        for sql_prefix, mappings in self.type_mappings.items():
            if sql_type_upper.startswith(sql_prefix):
                return mappings.get(target_language, 'any')
        return 'any' if target_language == 'typescript' else 'Object'